/*任务调度器*/
#include "scheduler.h"
/*结构体*/
typedef struct
{
	void (*task_func)(void);
	uint32_t rate_ms;//运行周期
	uint32_t last_run;//上次运行时间
}task_t;

uint8_t task_num;//储存循环次数


/*用于储存结构体和结构体名称*/
static task_t scheduler_task[] = 
{
//	 {tarcking_task, 10, 0},//循迹的任务打开
//	 {openmv_task, 10, 0},//openmv接收任务
//	 {encoder_task,10,0},
//	 {buzzer_run,2,0},
//	 {oled_task,50,0},
//     {key_proc,20,0},//按键任务,执行周期为10ms+
	 {led_proc,50,0},//LED任务,执行周期为100ms

//		Sensor_TaskWrapper();

	 
	
};

void scheduler_init()//结构体初始化
{
	task_num = sizeof(scheduler_task) / sizeof(task_t);//数组大小/结构体大小
	
}
/*调度器运行函数*/
void scheduler_run()
{
	for(uint8_t i=0;i<task_num;i++)
	{
		uint32_t now_time = HAL_GetTick();//获取当前时间
		if(now_time >= scheduler_task[i].rate_ms + scheduler_task[i].last_run)//运行周期+上次运行时间
		{
			scheduler_task[i].last_run = now_time;//更新时间
			scheduler_task[i].task_func();
		}
	}
	
}

//-------------------定时中断调度---------------------

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{
	if (htim->Instance == TIM3) 
	{
//		encoder_proc(&encoder,50);//50ms采样
	}
				
}













//        if (tick % 1 == 0) // 5ms
//		{  
//            Sensor_TaskWrapper();  
//        }





















/*
定时器中断   定时器中断调度
4个
 最高  1ms：循迹
2 5ms：jy62(100hz  10ms角度环)，编码器（10ms 速度测量- > 脉冲 cm/s 150cm/s 速度环，里程计，位置环）；按键检测
  3   10ms：跑的任务
 4   100ms：
while1   oled刷新（50ms），eeprom读写

pid 位置式    / 增量式
0  0°  ->   10°      error =  10°
10ms  1°     10°      error =  9°  
p error*kp
i 给error积分 
d 微分求导  （last_error - error）*kd
*/
